package org.example.rzfx.config;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.example.rzfx.entity.SysConfig;
import org.example.rzfx.mapper.SysConfigMapper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 全局配置管理器
 * 
 * 功能：
 * 1. 从数据库加载系统配置到内存
 * 2. 定时刷新配置（每10分钟）
 * 3. 提供配置读取接口
 * 4. 保证全局有效
 */
@Component
@Slf4j
public class GlobalConfig {
    
    @Resource
    private SysConfigMapper sysConfigMapper;
    
    /**
     * 配置缓存（线程安全）
     */
    private final Map<String, String> configCache = new ConcurrentHashMap<>();
    
    /**
     * 应用启动时加载配置
     */
    @PostConstruct
    public void init() {
        loadConfigs();
        log.info("========== 全局配置加载完成 ==========");
        log.info("日志保留期: {} 天", getLogRetentionDays());
        log.info("缓存过期时间: {} 小时", getCacheExpireHours());
        log.info("邮件通知: {}", isEmailNotificationEnabled());
        log.info("自动清理日志: {}", isAutoCleanLogEnabled());
        log.info("======================================");
    }
    
    /**
     * 从数据库加载所有配置
     */
    private void loadConfigs() {
        try {
            configCache.clear();
            
            LambdaQueryWrapper<SysConfig> wrapper = new LambdaQueryWrapper<>();
            java.util.List<SysConfig> configList = sysConfigMapper.selectList(wrapper);
            
            for (SysConfig config : configList) {
                configCache.put(config.getConfigKey(), config.getConfigValue());
            }
            
            log.info("已加载 {} 项系统配置", configCache.size());
            
        } catch (Exception e) {
            log.error("加载系统配置失败", e);
        }
    }
    
    /**
     * 定时刷新配置（每10分钟）
     */
    @Scheduled(cron = "0 */10 * * * ?")
    public void refreshConfigs() {
        log.info("开始刷新系统配置...");
        loadConfigs();
    }
    
    /**
     * 获取配置值
     */
    public String getConfig(String key, String defaultValue) {
        return configCache.getOrDefault(key, defaultValue);
    }
    
    /**
     * 获取整型配置
     */
    public int getIntConfig(String key, int defaultValue) {
        try {
            String value = configCache.get(key);
            return value != null ? Integer.parseInt(value) : defaultValue;
        } catch (Exception e) {
            log.warn("解析配置失败: key={}, 使用默认值={}", key, defaultValue);
            return defaultValue;
        }
    }
    
    /**
     * 获取布尔型配置
     */
    public boolean getBooleanConfig(String key, boolean defaultValue) {
        String value = configCache.get(key);
        return value != null ? "true".equalsIgnoreCase(value) : defaultValue;
    }
    
    // ==================== 具体配置项 ====================
    
    /**
     * 获取日志保留天数
     */
    public int getLogRetentionDays() {
        return getIntConfig("log.retention.days", 30);
    }
    
    /**
     * 获取缓存过期小时数
     */
    public int getCacheExpireHours() {
        return getIntConfig("cache.expire.hours", 48);
    }
    
    /**
     * 是否启用邮件通知
     */
    public boolean isEmailNotificationEnabled() {
        return getBooleanConfig("email.notification", true);
    }
    
    /**
     * 是否自动清理日志
     */
    public boolean isAutoCleanLogEnabled() {
        return getBooleanConfig("auto.clean.log", true);
    }
    
    /**
     * 获取告警检查间隔（秒）
     */
    public int getAlarmCheckInterval() {
        return getIntConfig("alarm.check.interval", 60);
    }
    
    /**
     * 手动刷新配置（供Controller调用）
     */
    public void manualRefresh() {
        loadConfigs();
    }
    
    /**
     * 获取所有配置（调试用）
     */
    public Map<String, String> getAllConfigs() {
        return new ConcurrentHashMap<>(configCache);
    }
}

